package com.enjoyor.soa.traffic.frame.support.amq;

import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.Session;

/**
 * ActiveMQ 基础类，所有AMQ相关工具可以根据需要继承本类
 *
 * @author WY
 * @reviser WY
 * @date 2015-4-8
 */

public abstract class AbstractActiveMQ {
	/** AMQ异常时延时重连时间(单位为秒) */
	public final static int CONNECTION_FAILED_DELAY = 30;

	private String url = null;
	private String queue = null;
	private boolean closed = false;

	// Connection ：JMS 客户端到JMS Provider 的连接
	private Connection connection;
	// Session： 一个发送或接收消息的线程
	private Session session;

	/**
	 * 根据 url 和名称构造消息队列
	 * @param url 需要构造的消息队列URL
	 * @param queue 需要构造的消息队列名称
	 */
	public AbstractActiveMQ(String url, String queue) {
		this.url = url;
		this.queue = queue;
	}

	public String getUrl() {
		return url;
	}

	public String getQueue() {
		return queue;
	}

	Connection getConnection() {
		return connection;
	}

	void setConnection(Connection connection) {
		this.connection = connection;
	}

	Session getSession() {
		return session;
	}

	void setSession(Session session) {
		this.session = session;
	}

	boolean running() {
		return !closed;
	}

	void shutdown() {
		this.closed = true;
	}

	/**
	 * AMQ引擎初始化操作，在引擎启动之前执行。
	 */
	public abstract void initialize();

	public abstract Message receiveMessage(int time);

	/**
	 * AMQ引擎连接终止操作，在结束 JMS 引擎连接后执行。<pre>
	 * <b>[注意]</b> 程序结束时请务必关闭AMQ连接。</pre>
	 */
	public abstract void endEngine();
}
